package com.demo.core.service.base;

import java.util.List;
import java.util.Map;

import com.demo.core.dao.base.support.ResultSearchResult;
import com.demo.core.model.Form;
import com.demo.core.model.FormItem;
import com.demo.core.model.FormItemExtend;

/**
 * 表单服务接口
 * 
 * @author ryuu.kk
 *
 */
public interface FormService {
	
	/**
	 * 存储Form模型
	 * 如果表单FormItem存在时,
	 * 将FormItem持久化。
	 * @param form form模型对象
	 * @return 主键ID
	 */
	Long save(Form form);
	
	/**
	 * 存储FormItem模型
	 * @param item FormItem
	 * @return Long 主键ID
	 */
	Long save(FormItem item);
	
	/**
	 * 存储FormItem模型列表
	 * @param id Form主键ID
	 * @param itemList List<FormItem>
	 */
	void save(Long id, List<FormItem> itemList);
	
	/**
	 * 存储FormItemExtend扩展模型
	 * @param itemExtend FormItemExtend
	 * @return Long 主键ID
	 */
	Long save(FormItemExtend itemExtend);
	
	/**
	 * 判断Form模型是否存在
	 * @param id 主键ID
	 * @return 是否存在
	 */
	boolean formExists(Long id);
	
	/**
	 * 判断FormItem模型是否存在
	 * @param id 主键ID
	 * @return 是否存在
	 */
	boolean formItemExists(Long id);
	
	/**
	 * 判断FormItemExtend模型是否存在
	 * @param id 主键ID
	 * @return 是否存在
	 */
	boolean formItemExtendExists(Long id);
	
	/**
	 * 更新可用标志
	 * @param id 主键ID
	 * @param enabled 是否可用
	 * @param status 表单状态
	 */
	void updateFormStatus(Long id, Boolean enabled, String status);
	
	/**
	 * 更新表单信息
	 * @param id 表单的主键ID
	 * @param name 表单名
	 * @param title 表单标题
	 */
	void updateForm(Long id, String name, String title);
	
	/**
	 * 更新表单项的名称,标题,行为属性信息
	 * @param id 表单的主键ID
	 * @param name 表单名
	 * @param title 表单标题
	 * @param action 表单行为
	 */
	void updateFormItemProperties(Long id, String name, String title, String action);
	
	/**
	 * 更新表单项的Key-Value和type映射信息
	 * @param id 表单的主键ID
	 * @param key 表单项映射名
	 * @param value 表单项映射值
	 * @param type 表单项映射类型
	 */
	void updateFormItemMapping(Long id, String key, String value, String type);
	
	/**
	 * 更新表单项的内联HTML信息
	 * @param id 表单的主键ID
	 * @param htmlId 生成HTML的ID
	 * @param htmlElement HTML成员:a/button/input等
	 * @param htmlType html类型,如hidden/text/radio等
	 */
	void updateFormItemHtml(Long id, String htmlId, String htmlElement, String htmlType, String innerHtml);
	
	/**
	 * 更新表单项的数据源绑定信息
	 * @param id 表单项的主键ID
	 * @param ds 数据源名
	 * @param bindName 名称的数据绑定名
	 * @param bingValue 值的数据绑定名
	 */
	void updateFormItemSource(Long id, String ds, String bindName, String bindValue);
	
	/**
	 * 清除表单项的数据源绑定信息
	 * 由于iBatis的动态Update弊端
	 * @param itemId 表单项的主键ID
	 */
	void clearFormItemSource(Long itemId);
	
	/**
	 * 更新表单项的可用标志
	 * @param id 主键ID
	 * @param enabled 是否可用
	 * @param status 表单状态
	 */
	void updateFormItemStatus(Long id, Boolean enabled, String status, int priority);
	
	/**
	 * 更新表单项扩展属性信息
	 * @param id 表单扩展属性的主键ID
	 * @param name 表单名
	 * @param title 表单标题
	 */
	void updateFormItemExtendProperties(Long id, String name, String title);
	
	/**
	 * 更新表单项扩展属性映射信息
	 * @param id 表单扩展属性的主键ID
	 * @param key 扩展属性映射名
	 * @param value 扩展属性映射值
	 */
	void updateFormItemExtendMapping(Long id, String key, String value);
	
	/**
	 * 删除表单信息
	 * @param id 表单ID
	 */
	void deleteForm(Long id);
	
	/**
	 * 删除表单项信息
	 * @param id 表单项ID
	 */
	void deleteFormItem(Long id);
	
	/**
	 * 删除表单项信息(多删)
	 * @param formId 表单ID
	 */
	void deleteFormItems(Long formId);
	
	/**
	 * 删除表单项扩展属性信息
	 * @param formItemExtendId 表单项扩展属性模型主键ID
	 */
	void deleteFormItemExtend(Long formItemId);
	
	/**
	 * 删除表单项扩展属性信息(多删)
	 * @param formItemId 表单项ID
	 */
	void deleteFormItemExtends(Long formItemId);
	
	/**
	 * 取得表单属性
	 * @param formId 表单ID
	 * @return 表单模型对象
	 */
	Form findForm(Long formId);
	
	/**
	 * 通过站点ID查询站点的所有表单
	 * @param siteId 站点ID
	 * @return 站点表单对象模型
	 */
	List<Form> findFormList(Long siteId);
	
	/**
	 * 通过站点ID查询站点的所有表单
	 * @param siteId 站点ID
	 * @param i18n 数据语言
	 * @return 站点表单对象模型
	 */
	List<Form> findFormList(Long siteId, String i18n);
	
	/**
	 * 取得表单项模型
	 * @param formItemId 表单项主键ID
	 * @return 表单项模型对象
	 */
	FormItem findFormItem(Long formItemId);
	
	/**
	 * 通过表单ID查询所有表单项
	 * @param formId 表单ID
	 * @return List<FormItem>
	 */
	List<FormItem> findFormItemList(Long formId);
	
	/**
	 * 取得表单项模型列表
	 * @param formId 表单主键ID
	 * @param groupType 表单项分组
	 * @return List<FormItem> 表单项模型对象
	 */
	List<FormItem> findFormItemList(Long formId, int groupType);
	
	/**
	 * 联查查询表单和该表单子项列表
	 * @param 表单ID
	 * @return 表单模型
	 */
	Form queryForm(Long id);
	
	/**
	 * 联合查询站点表单列表及对应子项信息
	 * @param siteId 站点ID
	 * @return 表单模型列表
	 */
	List<Form> queryFormList(Long siteId);
	
	/**
	 * 使用站点ID和表单类型,查询站点的指定类型的表单列表
	 * @param siteId 站点ID
	 * @param type 表单模型类型:内置/站点/自定义
	 * @return List<Form>
	 */
	List<Form> queryFormList(Long siteId, String type);
	
	/**
	 * 使用站点ID、表单类型和可用标志查询表单模型列表
	 * @param siteId 站点ID
	 * @param type 表单类型,如果为空则不计入检索条件
	 * @param enabled 可用标志,如果为空则不计入检索条件
	 * @return List<Form>
	 */
	List<Form> queryFormList(Long siteId, String type, Boolean enabled);
	
	/**
	 * 查询站点的整个Form树
	 * @param siteId 站点ID
	 * @return Form
	 */
	Form queryTree(Long siteId);
	
	/**
	 * 查询Form树
	 * @param siteId 站点ID
	 * @param pid 树结构的父亲节点ID
	 * @return Form
	 */
	Form queryTree(Long siteId, Long pid);

	/**
	 * 联查查询表单项和表单项扩展属性模型列表
	 * @param formId 表单ID
	 * @param groupType 表单项分组
	 * @return List<FormItem> 表单项模型列表
	 */
	List<FormItem> queryFormItemList(Long formId, int groupType);
	
	/**
	 * 联查查询表单项和表单项扩展属性模型
	 * @param 表单项ID
	 * @return FormItem 表单项模型
	 */
	FormItem queryFormItem(Long formItemId);
	
	/**
	 * 取得表单项扩展属性模型
	 * @param formItemExtendId 表单项扩展模型主键ID
	 * @return FormItemExtend 表单项扩展属性模型对象
	 */
	FormItemExtend findFormItemExtend(Long formItemExtendId);
	
	/**
	 * 通过表单项ID查询所有表单项的扩展属性模型
	 * @param formItemId 表单项ID
	 * @return List<FormItemExtend>
	 */
	List<FormItemExtend> findFormItemExtendList(Long formItemId);
	
	/**
	 * 通过表单项ID和扩展属性名,查询所有表单项的扩展属性模型
	 * @param formItemId 表单项ID
	 * @param key 扩展属性Key
	 * @return Map<String,  List<FormItemExtend>> 
	 */
	Map<String,  List<FormItemExtend>> findFormItemExtendMap(Long formItemId, String key);
	
	/**
	 * 分页查询站点表单列表
	 * @param siteId 站点ID
	 * @param type 表单模型的类型：内置/站点/自定义;设置为空则检索所有类型
	 * @param firstResult 起始节点
	 * @param maxResults 最大条目
	 * @return ResultSearchResult<Form>
	 */
	ResultSearchResult<Form> searchForm(Long siteId, String type, int firstResult, int maxResults);
	
	/**
	 * 分页查询站点表单列表
	 * @param siteId 站点ID
	 * @param type 表单模型的类型：内置/站点/自定义;设置为空则检索所有类型
	 * @param firstResult 起始节点
	 * @param maxResults 最大条目
	 * @param sort 排序字段
	 * @return ResultSearchResult<Form>
	 */
	ResultSearchResult<Form> searchForm(Long siteId, String type, int firstResult, int maxResults, String... sort);
}
